<?php
/**
 * 短信控制器
 */
namespace Users\Controller;
use Common\Controller\BaseController;
class SendController extends BaseController{
	
	/**
	 * @desc 发送短信验证码
	 * @param string type 必须 验证码用途标示
	 * @param string mobile 必须 手机号码
	 * @param boolean checkuser 非必须 默认为0，取值可以为1
	 * @return json
	 */
	public function sms_vcode(){
		//需要检测token
		_check_api_token(I('token'));
		
		$type = $_REQUEST['type'];
		$mobile = $_REQUEST['mobile'];
		if(!$type){
			_apiReturn(0,'miss param type');
		}
		if(!$mobile){
			_apiReturn(0,'miss param mobile');
		}
		if(I('checkuser')){
			$user = M('Users')->where('mobile = "'.$mobile.'"')->find();
			if(!$user){
				_apiReturn(0,'This mobile has not register in our system');
			}
		}
		$m = M('Sms');
		//先检测该手机该类型验证码是否在60内重复发送，如果是则返回报错
		$old = $m->where(array('mobile'=>$mobile,'type'=>$type))->find();
		if($old){
			if(strtotime(Date('Y-m-d H:i:s')) - strtotime($old['create_time']) < 60){
				_apiReturn(0,'can not resend sms in 60s');
			}
		}
		C('sms_key_length') == 4 ? $code = rand(1000,9999) : $code = rand(100000,999999);
		$params = '{"code":"'.$code.'","product":"'.C('sms_product').'"}';
		$ret = $this->_sms($mobile, 'shenfen', $params, $signName); //发送短信,返回短信发送结果
		
		if($ret == 1){
			$data = array(
				'mobile' => $mobile,
				'code'   => $code,
				'type'   => $type,
				'status' => 1,
				'hasuse' => 2,
				'token_time' => time()+60*30, //有效期30分钟
				'create_time' => Date('Y-m-d H:i:s'),
			);
			
			
			$m->where(array('mobile'=>$mobile,'type'=>$type))->delete(); //删除掉原有的短信验证码
			if($m->add($data)){
				//return true;
				_apiReturn(1,'success');
			}else{
				_apiReturn(0,'error, can not write data to database');
				//return false;
			}
			
		}else{
			_apiReturn(0,$ret);
		}
		
	}
	
	/**
	 * @desc 校验短信验证码
	 * @param string type 必须 验证码用途标示
	 * @param string mobile 必须 手机号码
	 * @param string code 必须 用户填写的验证码
	 * @return json
	 */
	public function sms_vcode_check(){
		//需要检测token
		_check_api_token(I('token'));
		
		$type = $_REQUEST['type'];
		$mobile = $_REQUEST['mobile'];
		$code = $_REQUEST['code'];
		if(!$type){
			_apiReturn(0,'miss param type');
		}
		if(!$mobile){
			_apiReturn(0,'miss param mobile');
		}
		if(!$code){
			_apiReturn(0,'miss param code');
		}
		
		$m = M('Sms');
		$map = array(
			'mobile' => $mobile,
			'type'   => $type,
			'status' => 1,
			'hasuse' => 2,
			'token_time' => array('EGT',time()),
		);
		$sms_info = $m->where($map)->find();
		if($sms_info['code'] === $code){
			$m->where(array('id'=>$sms_info['id']))->delete();
			$ret['docode'] = sha1($mobile.$type.uniqid());
			S($mobile.'_'.$type,$docode,1800); //存一个docode参数,30分钟有效期，用了判断是否有权限执行下一步操作
			_apiReturn(1,'success',$ret);
		}else{
			_apiReturn(0,'error,code is not right');
		}
	}
	
	/**
	 * 短信发送基方法
	 */
	public function _sms($mobile,$tplkey,$params,$signName){
		if(!$mobile){
			_apiReturn(0,'手机号码不能为空');
		}
		if(!$tplkey){
			_apiReturn(0,'短信模板名不能为空');
		}
		$alidayu = new \Users\Lib\Alidayu\SendSMS(C('ALIDAYU_TPLS'));
		$result = $alidayu->send($mobile,$tplkey,$params);
		
		if($result == -1){
			return 'the sms tpl is not exist';
		}
	
		if($result['result']['success']){
			return 1;
		}else{
			return 'send sms error';
		}
	}
	
	/**
	 * @desc 发送短信，用了阿里大鱼的接口
	 * @param string mobile 必须 手机号码
	 * @param string tplkey 必须 短信模板关键词，shenfen、login、loginError、reg、resetpwd、setinfo
	 * @param json params 必须 可以是多个，根据阿里大鱼短信模板来，demo：{"code":"123456","product":"56号教室"}
	 * @param string signName 非必须 签名
	 * @return json {json统一结构} {status:1或0,info:信息,data:返回的数据,url:重定向地址}
	 */
	public function sms(){
		//需要检测token
		_check_api_token(I('token'));
		
		$mobile = trim($_REQUEST['mobile']);
		$tplkey = trim($_REQUEST['tplkey']);
		$params = trim($_REQUEST['params']);
		$signName = trim($_REQUEST['signName']); //签名
		
		$ret = $this->_sms($mobile, $tplkey, $params, $signName);
		if($ret == 1){
			_apiReturn(1,'短信发送成功');
		}else{
			_apiReturn(0,$ret);
		}
	}
	
	/**
	 * @desc 发送邮件
	 * @param email to 必须 发送对象邮箱地址
	 * @param string title 必须 邮件标题
	 * @param string content 必须 邮件内容
	 * @return json {json统一结构} {status:1或0,info:信息,data:返回的数据,url:重定向地址}
	 */
	public function email(){
		//需要检测token
		_check_api_token(I('token'));
		
		$to = $_REQUEST['to'];
		$title = $_REQUEST['title']; 
		$content = $_REQUEST['content']; 
		
		if(!$to) _apiReturn(0,'发送对象邮箱不能为空');
		$pattern = "/^([0-9A-Za-z\\-_\\.]+)@([0-9a-z]+\\.[a-z]{2,3}(\\.[a-z]{2})?)$/i";
		if (!preg_match( $pattern, $to )) _apiReturn(0,'邮箱格式不正确');
		
		if(!$title) _apiReturn(0,'邮件标题不能为空');
		if(!$content) _apiReturn(0,'邮件内容不能为空');
		
		if(SendMail($to,$title,$content)){
			_apiReturn(1,'邮件发送成功');
		}else{
			_apiReturn(0,'系统错误，邮件发送失败');
		}
	}
	
	
	/**
	 * @desc 图形验证码
	 * @param string type 必须 验证码用途
	 * @param int fontsize 非必须 字体大小
	 * @param int h 非必须 图片高度
	 * @param int w 非必须 图片宽度
	 * @param int l 非必须 验证码位数
	 * @return 验证码地址
	 */
	public function verify(){
		$type = I('type');
		if(!$type) _apiReturn(0, '请设置验证码ID', $data, $url);
		$config = array(
				'fontSize'  =>  _param_default($_GET['fontsize'], 25),              // 验证码字体大小(px)
				'imageH'    =>  _param_default($_GET['h'], 0),               // 验证码图片高度
				'imageW'    =>  _param_default($_GET['w'],0),               // 验证码图片宽度
				'length'    =>  _param_default($_GET['l'], 5),               // 验证码位数
		);
	
		$verify = new \Think\Verify($config);
		$verify->entry($type); //$_GET['id'] id为验证码表示
	}
	
	/**
	 * @desc 验证码校验
	 * @param string type 必须 验证码ID
	 * @param string verify 必须 输入的验证码
	 * @param string callback 非必须 返回地址
	 * @return json
	 */
	public function verify_check(){
		$type = I('type');
		$verify = I('verify');
		$callback = I('callback');
		
		if(!$verify || !$type) _apiReturn(0, '参数不全', $data, $url);
		$config = array(
				'fontSize'  =>  _param_default($_GET['fontsize'], 25),              // 验证码字体大小(px)
				'imageH'    =>  _param_default($_GET['h'], 0),               // 验证码图片高度
				'imageW'    =>  _param_default($_GET['w'],0),               // 验证码图片宽度
				'length'    =>  _param_default($_GET['l'], 5),               // 验证码位数
		);
		
		$verifyObj = new \Think\Verify($config);
		
		if(!$verifyObj->check($verify,$type)){
			unset($_SESSION['verify_next_'.$type]);
			_apiReturn(0, 'error', $data, $callback);
		}else{
			$_SESSION['verify_next_'.$type] = md5(uniqid()); //生成授权码
			_apiReturn(1, 'success',$_SESSION['verify_next_'.$type] , $callback);
		}
	}
}
?>